Data Visualizations by County

Rows {data-width = 150}

Total Cases in TN

5,308 (7.5%)

Negative Tests

65,291 (92.3%)

Total Deaths

101 (0.1%)

Column

Cases across time in most populous counties

Cases across time in most populous counties

Row {data-width = 650}

Cases per million residents

Column

Positive cases by county

Positive cases by county

Column

All Cases by County

All Cases by County

About

The Tennessee Coronavirus Dashboard

The sole intention of this Coronavirus dashboard is to provide a visual overview of the 2019 Novel COVID-19 as it relates to counties in Tennessee. The data is acquired from two different sources, and there are no guarantees on the accuracy of the data becaues of differences in numbers reported and reporting time.

Note: This dashboard has different graphs for small screens. For more interactive graphs, please view this website on a large screen (computer/large table).

Data

Data for “Cases across time in most populous counties” is a concatenation of the New York Times Coronavirus Data and the Tennessee State Data Center, which acquires its data from the TN Department of Health

Latest data from 04-12.

Created by Malle Carrasco-Harris.

---
title: "COVID-19 | Tennessee"
output:
    flexdashboard::flex_dashboard:
      orientation: rows
      vertical_layout: scroll
      social: menu
      source_code: embed
knit: (function(input_file, encoding) {
  out_dir <- 'docs';
  rmarkdown::render(input_file,
 encoding=encoding,
 output_file=file.path(dirname(input_file), out_dir, 'index.html'))})
---
  

```{r setup, include=FALSE}
library(flexdashboard)
library(readr)
library(ggplot2)
library(tidyverse)
library(dplyr)
#Acquire Data####
#Load NY Times Data###
nyt_path = 'https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv'

counties = read_csv(url(nyt_path)) #Originally contains all counties in US.

#Separate State
tn = counties[ which(counties$state =='Tennessee'),]
tn = tn[which(tn$date < '2020-03-31'),] #The Tennessee data from the new source has data starting March 31

#Tennessee data from online
tn_daily = read_csv('TN_County_Daily.csv')

names(tn_daily) = c('Date', 'County', 'Positive', 'Negative', 'Death')

tn_daily$County = ifelse(tn_daily$County == 'Non-Tennessee Resident',
                          "Out of TN",
                          tn_daily$County)

tn_daily$County = ifelse(tn_daily$County == grep('pending', tn_daily$County,ignore.case=TRUE, value= TRUE),
                         "Pending",
                         tn_daily$County)
tn_daily$County = as.factor(tn_daily$County)
tn_daily$Date = as.Date(tn_daily$Date, format = '%m/%d/%y')


#Merge NYT and Tn Daily dataframes####
tn_daily2 = tn_daily[,c('Date','County', 'Positive', 'Death')]
names(tn_daily2) = c('date','county', 'cases', 'deaths')
tn_daily2 = tn_daily2[!(tn_daily2$county =='Out of TN' | tn_daily2$county =='Pending'),]
tn_daily2 = tibble::add_column(tn_daily2, state = 'Tennessee', .after='county')

fips_daily =tn %>% group_by(county, fips) %>% tally()

tn_daily2 = left_join(tn_daily2, fips_daily[,1:2], by ='county')
##Row bind tn_daily (TN Health Dept) with tn
tn = rbind(tn, tn_daily2) #Rbind will automatically put the correct columns together. 


#Add population ####
#Get Population for counties in Tennessee
uscensus = 'https://raw.githubusercontent.com/mfcarrasco/COVID-TN-Counties/master/county_pop_2019.csv'
tn_pop = read_csv(url(uscensus))
tn_pop = tn_pop[ which(tn_pop$State =='Tennessee'),]
tn_pop = tn_pop[-1,c(2:3)]
tn_pop$County = gsub(' County', '', tn_pop$County)
tn_pop$Population = as.numeric(tn_pop$Population)
tn_pop = tn_pop[, c('County', 'Population')]
names(tn_pop) = c('county', 'population')
#tn_pop[order(-tn_pop$population),]

##Combine tn (NYT) dataframe with Population
tn = left_join(tn, tn_pop, by='county')
tn$county = as.factor(tn$county)

#Calculate per million
tn['cases_per_million'] = (tn$cases/tn$population)*10^6


#Clean the global environment###
rm(list=ls()[!ls() %in% c('tn', 'tn_daily')])
```

Data Visualizations by County
=======================================

Rows {data-width = 150}
-----------
### Total Cases in TN

```{r}
tn_daily = tn_daily %>% group_by(County) %>% top_n(1,Date)
total_cases = sum(tn_daily$Positive)
total_negative = sum(tn_daily$Negative)
total_death = sum(tn_daily$Death)

total = sum(total_cases, total_negative, total_death)

#Total Positive Cases
cases_per = ((total_cases/total)*100) %>% round(1) %>% paste0('%')
total_cases = total_cases %>% formattable::comma(digits=0) %>% paste0(' (',cases_per,')')

valueBox(value = total_cases, icon='fa-user-plus', color='#002D65')
```

### Negative Tests 

```{r} 
#Total Negative Cases
negative_per = ((total_negative/total)*100) %>% round(1) %>% paste0('%')
total_negative = total_negative %>% formattable::comma(digits=0) %>% paste0(' (', negative_per,')') 
valueBox(value = total_negative, icon='fa-user-minus', color='#CC0000')
```

### Total Deaths

```{r} 
#Total Deaths Cases
death_per = ((total_death/total)*100) %>% round(1) %>% paste0('%')
total_death = total_death %>% formattable::comma(digits=0) %>% paste0(' (',death_per,')')  
valueBox(value = total_death, color='#002D65')
```

Column {data-width=650}
-----------------------------------------------------------------------

### Cases across time in most populous counties

```{r}
library(plotly)
tn_top =c('Shelby', 'Davidson', 'Knox', 'Hamilton', 'Rutherford', 'Williamson')
tn_top = tn[ tn$county %in% tn_top,]


t_line = tn_pop_line =ggplot(data=tn_top, aes(x=date, y=cases, color=county))+
  geom_line(size=1)+
  scale_x_date(expand = c(0,0), date_breaks = '2 day', date_labels = '%b %d')+
  labs(x='', y='Cases')+theme(legend.title = element_blank(), panel.background = element_blank(), axis.line.x=element_line(), axis.line.y.left = element_line(), axis.text=element_text(face='bold'),axis.text.x = element_text(angle=45, hjust=1))
ggplotly(t_line)
```

### Cases across time in most populous counties {.mobile}

```{r}
tn_top =c('Shelby', 'Davidson', 'Knox', 'Hamilton', 'Rutherford', 'Williamson')
tn_top = tn[ tn$county %in% tn_top,]

ggplot(data=tn_top, aes(x=date, y=cases, color=county))+
  geom_line(size=1)+
  scale_x_date(expand = c(0,0), date_breaks = '2 day', date_labels = '%m-%d')+
  labs(x='', y='Cases')+
  theme(legend.title = element_blank(), 
        panel.background = element_blank(),
        axis.line.x=element_line(), 
        axis.line.y.left = element_line(), 
        axis.text=element_text(face='bold'),
        axis.text.x = element_text(angle=45, hjust=1),
        legend.position = c(0,.9),
        legend.justification = c(-0.1,.8))
```

Row {data-width = 650}
-------------------------

### Cases per million residents

```{r, fig.width=10, fig.height=5}
library(usmap)
library(viridis)
tn_geo =tn %>% group_by(county) %>% top_n(1,date)
tn_geo = tn_geo[!(tn_geo$county =='Unknown'),]


tn_geo$fips =fips(state = 'TN', county=tn_geo$county) #get missing fips values for map

plot_usmap(include='TN', regions =  'counties',
           data=tn_geo, values='cases_per_million')+
  labs(title="COVID Cases per Million in Tennessee",
       subtitle = "Based on NYTimes Github Data & \nCensus 2019 Estimates")+
  scale_fill_viridis(name='Cases per million')+
  theme(legend.position = 'right')+
  labs(caption = format(Sys.time(), "%D"))
```

Column {data-width=350, data-height=950}
-----------------------------------------------------------------------

### Positive cases by county

```{r}
tn_cases = tn_daily[which(tn_daily$Positive != 0 & 
                            tn_daily$County != 'Pending'  &
                            tn_daily$County != 'Out of TN'), c('County', 'Positive','Negative','Death')] #Remove where there are no cases

plot_ly(data=tn_cases,
        x=tn_cases$Positive,
        y=reorder(tn_cases$County, tn_cases$Positive),
        type='bar',
        orientation='h', 
        marker= list(color='red')) %>%
  layout(xaxis = list(title= 'Count', 
                      zeroline = FALSE, 
                      showline = F, 
                      showticklabels = T, 
                      showgrid = T),
         yaxis = list(showgrid = FALSE, 
                      showline = FALSE, 
                      showticklabels = TRUE,
                      dtick=1,
                      tickfont = list(size=10)))
```

### Positive cases by county {.mobile}

```{r}
tn_cases = tn_daily[which(tn_daily$Positive > 20 & 
                            tn_daily$County != 'Pending'  &
                            tn_daily$County != 'Out of TN'), c('County', 'Positive','Negative','Death')] #Remove where there are no cases

ggplot(data=tn_cases,aes(x=Positive, y=reorder(County,Positive)))+
  geom_col(fill='#CC0000')+
  ylab('')+
  xlab('')+
  theme(panel.background = element_blank(),
        axis.line.x=element_line(), 
        axis.line.y.left = element_line(), 
        axis.text=element_text(face='bold'), 
        axis.ticks = element_blank())+
  scale_x_continuous(expand= c(0,0))+
  ggtitle("Counties with more than 20 cases")
```

Column {data-height=650}
-----------------------------------------------------------------------

### All Cases by County

```{r}
tn_cases = tn_daily[which(tn_daily$Positive != 0 & 
                            tn_daily$County != 'Pending'  &
                            tn_daily$County != 'Out of TN'), c('County', 'Positive','Negative','Death')] #Remove where there are no cases

plot_ly(data=tn_cases,
        x= reorder(tn_cases$County, tn_cases$Negative),
        y=tn_cases$Negative,
        type='bar',
        name='Negative Cases',
        marker= list(color='darkblue')) %>%
          add_trace(y = tn_cases$Positive,
                    name='Positive Cases',
                    marker = list(color='yellow')) %>%
          add_trace(y = tn_cases$Death,
                    name='Deaths',
                    marker = list(color='red')) %>%
          layout(barmode = 'stack',
                 xaxis = list(showgrid = FALSE, 
                              showlilnee = FALSE, 
                              showticklabels = TRUE,
                              dtick=1,
                              tickfont =list(size=10)),
                 yaxis = list(title= 'Count', 
                              zeroline = FALSE, 
                              showline = F, 
                              showticklabels = T, 
                              showgrid = T),
                 hovermode = 'compare')
```

### All Cases by County {.mobile}

```{r}
library(plotly)
tn_cases = tn_daily[which(tn_daily$Positive > 50 & 
                            tn_daily$County != 'Pending'  &
                            tn_daily$County != 'Out of TN'), c('County', 'Positive','Negative','Death')] 

plot_ly(data=tn_cases,
        x= reorder(tn_cases$County, tn_cases$Negative),
        y=tn_cases$Negative,
        type='bar',
        name='Negative Cases',
        marker= list(color='darkblue')) %>%
  add_trace(y = tn_cases$Positive,
            name='Positive Cases',
            marker = list(color='yellow')) %>%
  add_trace(y = tn_cases$Death,
            name='Deaths',
            marker = list(color='red')) %>%
  layout(barmode = 'stack',
         title='Counties with more than 50 cases',
         xaxis = list(showgrid = FALSE, 
                      showlilnee = FALSE, 
                      showticklabels = TRUE,
                      dtick=1,
                      tickfont =list(size=10)),
         yaxis = list(title= 'Count', 
                      zeroline = FALSE, 
                      showline = F, 
                      showticklabels = T, 
                      showgrid = T),
         hovermode = 'compare')
```



About 
================================

**The Tennessee Coronavirus Dashboard**    
  
The sole intention of this Coronavirus dashboard is to provide a visual overview of the 2019 Novel COVID-19 as it relates to counties in Tennessee. The data is acquired from two different sources, and there are no guarantees on the accuracy of the data becaues of differences in numbers reported and reporting time.   

Note: This dashboard has different graphs for small screens. For more interactive graphs, please view this website on a large screen (computer/large table).   


**Data**

Data for "Cases across time in most populous counties" is a concatenation of the [New York Times Coronavirus Data](https://github.com/nytimes/covid-19-data) and the [Tennessee State Data Center](https://myutk.maps.arcgis.com/home/group.html?id=c98fc99308dd43fb98146d3cf21fc31c&q=tags%3A%22COVID-19%22&view=list&focus=files#content), which acquires its data from the [TN Department of Health](https://www.tn.gov/health/cedep/ncov.html)

Latest data from `r max(tn$date) %>% format('%m-%d')`.

Created by [Malle Carrasco-Harris](https://www.linkedin.com/in/malle-carrasco-harris).